<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>13_Canvas-保持和恢复绘画状态</title>
  <!-- 
  在 HTML5 的 Canvas 中，保持和恢复绘画状态是通过  `save()`  和  `restore()`  方法来实现的。这两个方法允许开发者保存当前的绘图状态（如变换、样式等），并在需要时恢复到之前的状态。
  1. 基本概念
  - 保存状态：使用  `save()`  方法可以保存当前的绘图状态，包括当前的变换矩阵、样式属性等。
  - 恢复状态：使用  `restore()`  方法可以恢复到上一个保存的状态。

  2. 使用步骤
   1. 保存当前状态
  在进行绘制之前，调用  `save()`  方法来保存当前状态：
  ctx.save();
   2. 进行绘制操作
  在保存状态后，可以进行一些绘制操作，例如改变样式、变换坐标等：
  ctx.fillStyle = 'red'; // 改变填充颜色
  ctx.fillRect(50, 50, 100, 100); // 绘制一个红色矩形
   3. 恢复之前的状态
  完成绘制操作后，可以调用  `restore()`  方法来恢复之前保存的状态：
  ctx.restore();
  3. 完整示例
  以下是一个完整的示例，展示如何使用  `save()`  和  `restore()`  方法：
  <canvas id="myCanvas" width="400" height="200" style="border:1px solid #000000;"></canvas>
  <script>
  const canvas = document.getElementById('myCanvas');
  const ctx = canvas.getContext('2d');

  // 保存当前状态
  ctx.save();

  // 绘制红色矩形
  ctx.fillStyle = 'red';
  ctx.fillRect(50, 50, 100, 100);

  // 恢复到保存的状态
  ctx.restore();

  // 绘制蓝色矩形
  ctx.fillStyle = 'blue';
  ctx.fillRect(100, 100, 100, 100);
  </script>
  4. 总结
  在 Canvas 中使用  `save()`  和  `restore()`  方法，可以方便地管理绘图状态。这对于在进行复杂绘制时，保持不同的样式和变换非常有用。通过保存和恢复状态，开发者可以避免手动管理每个绘图操作的状态，从而简化代码和提高可维护性。
  -->
  <style>
    body{
      margin: 0;
      padding: 0;
      background-image: url(../../images/grid.png);
    }
    canvas{
      background-color: rgba(255, 0, 0, 0.1);
    }
  </style>
  </head>
  <body>
  
  <canvas id="tutorial" width="300" height="300px">
    你的浏览器不兼容Canvas,请升级您的浏览器!
  </canvas>
  <script>
    window.onload = function(){
      // 1. 获取canvas元素
      var canvas = document.getElementById('tutorial');
      // 2. 获取绘图上下文
      var ctx = canvas.getContext('2d');
  
      ctx.fillStyle = 'red'// 设置填充颜色
      ctx.fillRect(10, 10, 30, 15)
      ctx.save()// 保存当前状态

      ctx.fillStyle = 'blue'// 设置填充颜色
      ctx.fillRect(10, 30, 30, 15)
      ctx.save()// 保存当前状态

      ctx.fillStyle = 'green'// 设置填充颜色
      ctx.fillRect(10, 50, 30, 15)
      ctx.save() // 保存当前状态

      // -------------------
      ctx.restore()// 恢复到上一个状态
      ctx.fillRect(110, 70, 30, 15)

      ctx.restore()// 恢复到上一个状态
      ctx.fillRect(110, 90, 30, 15)
      
      ctx.restore()// 恢复到上一个状态
      ctx.fillRect(110, 110, 30, 15)
    }
  
  </script>
  
</body>
</html>